#ifndef __USART_CONFIG_H
#define __USART_CONFIG_H

#include "stm32f10x.h"
#include "freertos.h"
#include "task.h"
#include "queue.h"

#include <stdio.h>
#include <stdarg.h>
#include <string.h>  // 包含strcmp()的声明
#include <stdint.h>  // 保证uint8_t类型定义

#define MAX_STR_LEN 128								// 字符串长度
extern QueueHandle_t xQueue;						// 此处需要声明，避免重复定义

//#define USART1_PORT GPIOA
//#define USART1_RCC RCC_APB2Periph_GPIOA
//#define USART1_TX_PIN GPIO_Pin_9 
//#define USART1_RX_PIN GPIO_Pin_10

// 定义引脚
typedef struct {
    USART_TypeDef* USARTx;      	// 硬件寄存器指针
    GPIO_TypeDef* GPIOx;         	// 对应GPIO组
    uint16_t TX_Pin;            	// TX引脚号
    uint16_t RX_Pin;             	// RX引脚号
    uint32_t BaudRate;           	// 波特率
    char name[8];                	// 串口名称（调试用）
} USART_Config;

// USART结构体配置
extern USART_Config USART1_Cfg;	
extern USART_Config USART2_Cfg;	
extern USART_Config USART3_Cfg;	

// 定义消息
typedef struct {
    uint8_t source_id;  			// 标识来源：1=USART1, 2=USART2, 3=USART3
    uint8_t data[MAX_STR_LEN];   	// 数据缓冲区（按需调整大小）
    uint8_t len;       				// 实际数据长度
} USART_Message;

// Init
void USART_Pin_Init(const USART_Config *cfg);
void USART_ClearRDR(const USART_Config *cfg);

// Send
void USART_SendByte(const USART_Config *cfg, uint8_t Byte);
void USART_SendString(const USART_Config *cfg, const char *str);
void USART_printf(const USART_Config *cfg, const char *format, ...);
//void USART_printf(const char *format, ...);
//void USART_SendByte(uint8_t Byte);
//void USART_SendString(const char *str);
//void USART_printf(const char *format, ...);

// Recv
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
void USART_NVIC_Init(const USART_Config *cfg);

#endif
